namespace Study601 {
  // Partial将T中的所有属性设置为可选
  type Person = {
    name: string;
    age: number;
  }
  type Person2 = Partial<Person>

  // Pick 从类型定义T的属性中，选取指定一组属性，返回一个新的类型定义
  type Person3 = {
    name: string;
    age: number;
    text: string;
    address: string;
  }
  // 要求1：使用Pink抽取 name|age属性，并且使用交叉类型新增e属性
  // 要求2：让新类型的属性变为可选

  type Person4 = Partial<Pick<Person3, "name" | "age"> & {
    e?: string;
  }>

  let objp4: Person4 = {
    age: 23,
    e: '378495',
    name: '387u'
  }

  interface User {
    id: number;
    name: string;
    email: string;
    password: string;
  }

  // 使用Omit排除user的password属性，并使用交叉类型新增sex属性
  type OmitUser = Omit<User, "password"> & {
    sex: string
  }
  let UserData: OmitUser = {
    email: 'str',
    id: 10001,
    name: '3287456',
    sex: 'nan'
  }

  // Readonly和Partial很像，只是把？替换成了Readonly
  type Person5 = {
    name: string,
    age: number,
    text: string,
    address: string
  }
  type person6 = Readonly<Person5>

  // Record
  // 定义传入的值
  type Persona = {
    name: string;
    age: number;
    text: string;
  }
  // 定义可传入的键
  type K = "a" | "b" | "c"
  type newobj2 = Record<K, Persona>

  class Student3 {
    constructor(
      public name: string,
      public age: number,
    ) { }
  }

  // 键：使用Persona属性作为键值 值：传入Student3对象 按照这个需求声明一个对象类型
  type StuType = Record<keyof Persona, Student3>

  let stuData: StuType = {
    name: new Student3('xiaohong', 88),
    age: new Student3('xiaoming', 88),
    text: new Student3('xiaohong', 88),
  }

  // 要求1：使用Pick抽取Persona的name和age属性
  type NewPersona = Pick<Persona, "name" | "age">
  // 要求2：使用Omit忽略Persona的gender属性
  type NewPersona2 = Omit<Persona, "gender">
  // 要求3：使用Partial将Persona的name和age属性变为可选
  type NewPersona3 = Partial<Persona>
  // 要求4：使用Required将Persona的name和age属性变为必填ness
  type NewPersona4 = Required<Persona>
  let newPersona: NewPersona = {
    age: 88,
    name: "xiaoming"
  }



}
